This document lists/expolains the JSON configuration metadata for Altermatic. Please refer to the most recently included templates for how JSON files should be structured, refer to this document if you need explainations on different entries.



[> How it works <]

Altermatic is a run-time replacer framework. The general idea is that instead of replacing files at compile/load (as in, replacing default assets so that Palworld loads them by default), Altermatic instead watches for objects to spawn through various systems, then dynamically swaps/adjusts assets based on the provided JSON config files.

When making config files all entries are assumed valid. Since validation is very heavy, Altermatic has to skip most validation methods for the sake of performance and reliability in execution. As such, it's important to test replacer packs before release to ensure they work as expected! If you are distributing/sharing JSON configs that include meshes from external packs, ensure users know of those packs and their requirements before hand to prevent any confusion and game issues.



[> Parameters <]

"PackName" [String]
    Optional but recommended parameter for easier recognition, can be pulled to display in UI implementations

"SkelMeshSwap"
    This defines an array of Skeletal Mesh Swaps you want Altermatic to perform with each entry having all the parameters you wish to be met. Used to swap the Pal/NPC models (doesn't work on player for technical reasons). The CharacterID, SkelMeshPath, and a Gender should all be set.

    "CharacterID" [Name]
        CharacterID is the UniqueID of the character you wish to change (the internal name of the character, in technical terms, the CharacterID, UnqiueNPCID, and BP Name are all checked).
    
    "SkelMeshPath" [String Path]
        SkelMeshPath defines the internal file path to the model you want to swap to.

    "MatReplace" [Set Array]
        MatReplace defines the index/slot of a material on the mesh and the file path to a Material Instance to replace it with. This also allows you to define multiple material set-ups for a single Skeletal Mesh without making duplicates, drastically simplifying the skins process. (Note: Even if your replacer doesn't change from the base game's model you still need to define the file path for SkelMeshPath, in this case you'd just set it to the path of the base game's model.)

        "Index" [Int]
            The material index/slot to target when swapping the material (slots and what Material Instance goes in what slot will depend on the Skeletal Mesh. Make sure to confirm which slot you need to replace or else things may look strange. Setting an index that isn't present on a Skeletal Mesh simply won't ever apply, the slot must be present to replace.)
        
        "MatPath" [String Path]
            Path to the Material Instance asset to replace the slot with.

    "Gender" [None/Female/Male (With SCake : Futa/FullFuta/Andro/Neutered/FullNeutered)]
        None/Female/Male (With SCake : Futa/FullFuta/Andro/Neutered/FullNeutered) (exclude=none)
        Gender defines what gender the Pal/NPC must be for the mesh swap in. By default only None/Male/Female are supported, however with SCake installed additional genders are supported.
    
    "IsRarePal" [True/False]
        Determines if this swap should only apply to 'Rare' pals as defined by the game. This will only apply to some specific spawns and wild spawns. If you want to apply the skin to offspring with Lucky trait then add the 'Rare' trait to ReqTrait instead.
    
    "SkinName" [Name]
        SkinName refers to the internal name for Palworld's skins system. You can choose to replace a specific skin by defining this parameter

    "ReqTrait" [Name Array]
        ReqTrait is a list of Traits (known internally as Passive Skills) that a character must posses to have the swap apply, exclude if you don't want to require any traits.

    "PrefTrait" [Name Array]
        PrefTrait is a list of Traits that are prefered for a character to have before applying the swap, any traits the character doesn't have causes the match quality to drop and is less likely to apply
    
    "MorphTarget" [Set Array]
        MorphTarget is for customizing Morph Targets (Known as BlendShapes in Blender) that will apply to a model swap, useful to apply dynamic body shapes and sizes (Note, Morphs should be designed to work between 0.0 and 1.0 float values, you can 'technically' exceed these limits, however they may not have the expected result and there's a hard limitation at around 800-ish)

        "Target" [Name]
            Target is the Name of the Morph Target to apply to and is required for this to work properly
        
        "Set" [Float]
            Use Set to apply a very specific value, if excluded then a random value between Min and Max will be selected
        
        "Min" [Float]
            Use Min to set the minimum value the Morph Target can apply, if excluded then 0.0 is set as Min
        
        "Max" [Float]
            Use Max to set the maximum value the Morph Target can apply, if excluded then 1.0 is set as Max
        
        "Type" [Free/Restrict]
            Type is how the morph should behave, if set to Free then any value between Min and Max can be used, if set to Restrict then only the Min or Max value can be used. Free is good for smooth body morphs while Restrict is good for showing/hiding certain features or creating toggles between shapes (Altermatic handles both automatically)



[> "Best Match" System <]

When Altermatic is selecting a swap to use it goes through a very simple Best Match system. Essentially there is a 'base match quality' that is set when scanning through potential matches. When a requirement is met then the match quality improves, if a preference is missed then the match quality decreases, if a requirement is missed then the match fails and that swap is skipped. This is all done with a linear points system which is then compared with other swaps where the closest to 'perfect' match is used, if 2 or more matches have the best score then one is randomly selected. (On a technical level we work in reverse, so 0 is considered a 'perfect match' and we add for how 'far from perfect' a match is. This has some limitations but is very fast to calculate so it shouldn't affect performance much and can be optimized more than other methods.)

Current match quality effects...

    - Miss = Swap did not match character params -
    - Hit = Character and Swap Match -
    - Fail = Character did not match requirement -

    Gender - Miss - +0 Degrade /or/ +50000 Degrade /or/ +500000 Degrade
    Gender - Fail - Skip Swap

    SkinName - Fail - Skip Swap

    IsRarePal - Miss = +20 degrade
    IsRarePal - Fail - Skip Swap
    
    ReqTrait - Hit = -5 degrade
    ReqTrait - Fail = Skip Swap

    PrefTrait - Miss = +5 degrade



[> Gender Matching (and SCake Extended Genders) <]

As noted in the Best Match System section, there are cases where Gender is allowed to Miss with or without a penalty. The reason for this is to ensure that compatible swaps can still be found whether a swap was configured with or without SCake in mind.

Without SCake installed then you only have None/Male/Female as the available genders in-game. By default all Non-Pal NPCs have 'None' as their gender, but with SCake a default gender is applied to NPCs. To ensure compatibility with SCake configurations, when SCake is not installed then 'None' on either the Swap or Character is allowed to 'Miss' without any penalty and both 'Male' and 'Female' swaps are allowed to occur. Genders assigned in the JSON config also change based on the below chart.
    None > None
    Male > Male
    Female > Female
    Futa > Male
    FullFuta > Male
    Andro > Female
    Neutered > Female
    FullNeutered > Female

With SCake installed you'll have access to the extended genders, but to ensure all genders are covered without explicit definitions the Gender param is allowed to 'Miss' in specific cases. SCake applies genders to all NPCs by default instead of leaving their assignment on 'None'. To ensure replacers may still be compatible, a Swap defined with 'None' will allowed to 'Miss' with a massive +500000 Match Quality Degrade penalty to allow swaps to still take place it no matches with the assigned gender are found. Extended genders will also be allowed to 'Miss' with Male/Female swaps with a penalty of +50000 Match Quality Degrade, meaning they will only be selected if no match is found for the extended gender (Applies to Futa and Andro genders, Neutered genders won't be allowed to 'Miss'). The potential compares allowed to 'Miss' are defined in the below chart.
    None > Any Gender
    Male > Futa/FullFuta
    Female > Andro
    Futa/FullFuta > Male
    Andro > Female



[> Pal Internal Names <]

Internally Palworld uses uniqueIDs to identify different pals while a translated FText variable is used for the readable name. I've extracted a list of pals and compiled them here. (In the format of "TranslatedName : InternalName")

Current as of STEAM version 0.3.7.???

Boltmane : ElecLion
Anubis : Anubis
Incineram : Baphomet
Incineram Noct : Baphomet_Dark
Mau : Bastet
Mau Cryst : Bastet_Ice
Rushoar : Boar
Lifmunk : Carbunclo
Tocotoco : ColorfulBird
Eikthyrdeer : Deer
Eikthyrdeer Terra : Deer_Ground
Digtoise : DrillGame
Galeclaw : Eagle
Grizzbolt : ElecPanda
Teafant : Ganesha
Direhowl : Garm
Gorirat : Gorilla
Gorirat Terra : Gorilla_Ground
Jolthog : Hedgehog
Jolthog Cryst : Hedgehog_Ice
Univolt : Kirin
Foxparks : Kitsunebi
Bristla : LittleBriarRose
Lunaris : Mutant
Pengullet : Penguin
Dazzi : RaijinDaughter
Gobfin : SharkKid
Gobfin Ignis : SharkKid_Fire
Lamball : SheepBall
Jormuntide : Umihebi
Jormuntide Ignis : Umihebi_Fire
Loupmoon : Werewolf
Hangyu : WindChimes
Hangyu Cryst : WindChimes_Ice
Suzaku : Suzaku
Suzaku Aqua : Suzaku_Water
Pyrin : FireKirin
Pyrin Noct : FireKirin_Dark
Elphidran : FairyDragon
Elphidran Aqua : FairyDragon_Water
Woolipop : SweetsSheep
Cryolinx : WhiteTiger
Melpaca : Alpaca
Surfent : Serpent
Surfent Terra : Serpent_Ground
Cawgnito : DarkCrow
Azurobe : BlueDragon
Cattiva : PinkCat
Depresso : NegativeKoala
Fenglope : FengyunDeeper
Reptyro : VolcanicMonster
Reptyro Cryst : VolcanicMonster_Ice
Maraith : GhostBeast
Robinquill : RobinHood
Robinquill Terra : RobinHood_Ground
Relaxaurus : LazyDragon
Relaxaurus Lux : LazyDragon_Electric
Kitsun : AmaterasuWolf
Leezpunk : LizardMan
Leezpunk Ignis : LizardMan_Fire
Fuack : BluePlatypus
Dragostrophe : BlackFurDragon
Vanwyrm : BirdDragon
Vanwyrm Cryst : BirdDragon_Ice
Chikipi : ChickenPal
Dinossom : FlowerDinosaur
Dinossom Lux : FlowerDinosaur_Electric
Sparkit : ElecCat
Frostallion : IceHorse
Frostallion Noct : IceHorse_Dark
Mammorest : GrassMammoth
Mammorest Cryst : GrassMammoth_Ice
Felbat : CatVampire
Broncherry : SakuraSaurus
Broncherry Aqua : SakuraSaurus_Water
Faleris : Horus
Blazamut : KingBahamut
Blazamut Ryu : KingBahamut_Dragon
Caprity : BerryGoat
Reindrix : IceDeer
Shadowbeak : BlackGriffon
Sibelyx : WhiteMoth
Vixy : CuteFox
Wixen : FoxMage
Wixen Noct : FoxMage_Dark
Lovander : PinkLizard
Hoocrates : WizardOwl
Kelpsea : Kelpie
Kelpsea Ignis : Kelpie_Fire
Killamari : NegativeOctopus
Mozzarina : CowPal
Wumpo : Yeti
Wumpo Botan : Yeti_Grass
Vaelet : VioletFairy
Nitewing : HawkBird
Flopie : FlowerRabbit
Lyleen : LilyQueen
Lyleen Noct : LilyQueen_Dark
Elizabee : QueenBee
Beegarde : SoldierBee
Tombat : CatBat
Mossanda : GrassPanda
Mossanda Lux : GrassPanda_Electric
Arsox : FlameBuffalo
Rayhound : ThunderDog
Fuddler : CuteMole
Astegon : BlackMetalDragon
Verdash : GrassRabbitMan
Foxcicle : IceFox
Jetragon : JetDragon
Daedream : DreamDemon
Tanzee : Monkey
Blazehowl : Manticore
Blazehowl Noct : Manticore_Dark
Kingpaca : KingAlpaca
Kingpaca Cryst : KingAlpaca_Ice
Gumoss : PlantSlime
Swee : MopBaby
Sweepa : MopKing
Katress : CatMage
Katress Ignis : CatMage_Fire
Ribbuny : PinkRabbit
Beakon : ThunderBird
Warsect  : HerculesBeetle
Warsect  Terra : HerculesBeetle_Ground
Paladius : SaintCentaur
Nox : NightFox
Penking : CaptainPenguin
Chillet : WeaselDragon
Chillet Ignis : WeaselDragon_Fire
Quivern : SkyDragon
Quivern Botan : SkyDragon_Grass
Helzephyr : HadesBird
Helzephyr Lux : HadesBird_Electric
Ragnahawk : RedArmorBird
Bushi : Ronin
Bushi Noct : Ronin_Dark
Celaray : FlyingManta
Necromus : BlackCentaur
Petallia : FlowerDoll
Grintale : NaughtyCat
Cinnamoth : CuteButterfly
Menasting : DarkScorpion
Menasting Terra : DarkScorpion_Ground
Orserk : ThunderDragonMan
Cremis : WoolFox
Dumud : LazyCatfish
Flambelle : LavaGirl
Rooby : FlameBambi
Bellanoir : NightLady
Bellanoir Libero : NightLady_Dark
Selyne : MoonQueen
Croajiro : KendoFrog
Lullu : LeafPrincess
Shroomer : MushroomDragon
Shroomer Noct : MushroomDragon_Dark
Kikit : SmallArmadillo
Sootseer : CandleGhost
Prixter : ScorpionMan
Knocklem : WingGolem
Yakumo : GuardianDog
Dogen : SifuDog
Dazemu : FeatherOstrich
Mimog : MimicDog
Xenovader : DarkAlien
Xenogard : WhiteAlienDragon



[> Trait Internal Names <]

Internally Palworld uses uniqueIDs to identify the actual trait while a translated FText variable is used for the readable name. I've extracted a list of traits and compiled them here. (In the format of "TranslatedName : InternalName")

Current as of STEAM version 0.3.3.55731

Serious : CraftSpeed_up1
Artisan : CraftSpeed_up2
Clumsy : CraftSpeed_down1
Slacker : CraftSpeed_down2
Hard Skin : Deffence_up1
Burly Body : Deffence_up2
Downtrodden : Deffence_down1
Brittle : Deffence_down2
Glutton : PAL_FullStomach_Up_1
Bottomless Stomach : PAL_FullStomach_Up_2
Dainty Eater : PAL_FullStomach_Down_1
Diet Lover : PAL_FullStomach_Down_2
Unstable : PAL_Sanity_Up_1
Destructive : PAL_Sanity_Up_2
Positive Thinker : PAL_Sanity_Down_1
Workaholic : PAL_Sanity_Down_2
Ferocious : PAL_ALLAttack_up2
Brave : PAL_ALLAttack_up1
Coward : PAL_ALLAttack_down1
Pacifist : PAL_ALLAttack_down2
Hooligan : PAL_rude
Mentally unstable : PAL_SpiritualInst
Sadist : PAL_sadist
Masochist : PAL_masochist
Work Slave : PAL_CorporateSlave
Conceited : PAL_conceited
Aggressive : PAL_oraora
Nimble : MoveSpeed_up_1
Runner : MoveSpeed_up_2
Swift : MoveSpeed_up_3
Musclehead : Noukin
Egg Layer : CollectItem_Egg
Milk Maker : CollectItem_Milk
Berry Picker : CollectItem_Berries
Confectioner : CollectItem_Sweets
Gold Digger : CollectItem_Money
Wool Maker : CollectItem_Wool_Alpaca
Wool Maker : CollectItem_Wool_SheepBall
Silk Spinner : CollectItem_Wool_WhiteMoth
Heat Resistant Lv. 1 : TemperatureResist_Heat1
Heat Resistant Lv. 2 : TemperatureResist_Heat2
Heat Resistant Lv. 3 : TemperatureResist_Heat3
Cold Resistant Lv. 1 : TemperatureResist_Cold1
Cold Resistant Lv. 2 : TemperatureResist_Cold2
Cold Resistant Lv. 3 : TemperatureResist_Cold3
Heat Resistant Lv. 1 / Cold Resistant Lv. 1 : TemperatureResist_Heat1Cold1
Heat Resistant Lv. 2 / Cold Resistant Lv. 2 : TemperatureResist_Heat2Cold2
Heat Resistant Lv. 3 / Cold Resistant Lv. 3 : TemperatureResist_Heat3Cold3
Lucky : Rare
Legend : Legend
Max Carrying Capacity Lv. 1 : MaxInventoryWeight_up
Max Carrying Capacity Lv. 2 : MaxInventoryWeight_up2
Max Carrying Capacity Lv. 3 : MaxInventoryWeight_up3
Neutral Damage Reduction Lv. 1 : ElementResist_Normal_1
Fire Damage Reduction Lv. 1 : ElementResist_Fire_1
Water Damage Reduction Lv. 1 : ElementResist_Aqua_1
Electric Damage Reduction Lv. 1 : ElementResist_Thunder_1
Grass Damage Reduction Lv. 1 : ElementResist_Leaf_1
Ice Damage Reduction Lv. 1 : ElementResist_Ice_1
Earth Damage Reduction Lv. 1 : ElementResist_Earth_1
Dark Damage Reduction Lv. 1 : ElementResist_Dark_1
Dragon Damage Reduction Lv. 1 : ElementResist_Dragon_1
Neutral Damage Reduction Lv. 2 : ElementResist_Normal_2
Fire Damage Reduction Lv. 2 : ElementResist_Fire_2
Water Damage Reduction Lv. 2 : ElementResist_Aqua_2
Electric Damage Reduction Lv. 2 : ElementResist_Thunder_2
Grass Damage Reduction Lv. 2 : ElementResist_Leaf_2
Ice Damage Reduction Lv. 2 : ElementResist_Ice_2
Earth Damage Reduction Lv. 2 : ElementResist_Earth_2
Dark Damage Reduction Lv. 2 : ElementResist_Dark_2
Dragon Damage Reduction Lv. 2 : ElementResist_Dragon_2
Neutral Damage Reduction Lv. 3 : ElementResist_Normal_3
Fire Damage Reduction Lv. 3 : ElementResist_Fire_3
Water Damage Reduction Lv. 3 : ElementResist_Aqua_3
Electric Damage Reduction Lv. 3 : ElementResist_Thunder_3
Grass Damage Reduction Lv. 3 : ElementResist_Leaf_3
Ice Damage Reduction Lv. 3 : ElementResist_Ice_3
Earth Damage Reduction Lv. 3 : ElementResist_Earth_3
Dark Damage Reduction Lv. 3 : ElementResist_Dark_3
Dragon Damage Reduction Lv. 3 : ElementResist_Dragon_3
Attack Up Lv. 1 : Attack_ACC_up1
Attack Up Lv. 2 : Attack_ACC_up2
Attack Up Lv. 3 : Attack_ACC_up3
Health Up Lv. 1 : HP_ACC_up1
Health Up Lv. 2 : HP_ACC_up2
Health Up Lv. 3 : HP_ACC_up3
Defense Up Lv. 1 : defense_ACC_up1
Defense Up Lv. 2 : defense_ACC_up2
Defense Up Lv. 3 : defense_ACC_up3
Speedy Worker Lv. 1 : WorkSpeed_ACC_up1
Speedy Worker Lv. 2 : WorkSpeed_ACC_up2
Speedy Worker Lv. 3 : WorkSpeed_ACC_up3
Vanguard : TrainerATK_UP_1
Stronghold Strategist : TrainerDEF_UP_1
Motivational Leader : TrainerWorkSpeed_UP_1
Mine Foreman : TrainerMining_up1
Logging Foreman : TrainerLogging_up1
Abnormal : ElementResist_Normal_1_PAL
Suntan Lover : ElementResist_Fire_1_PAL
Waterproof : ElementResist_Aqua_1_PAL
Insulated Body : ElementResist_Thunder_1_PAL
Botanical Barrier : ElementResist_Leaf_1_PAL
Heated Body : ElementResist_Ice_1_PAL
Earthquake Resistant : ElementResist_Earth_1_PAL
Cheery : ElementResist_Dark_1_PAL
Dragonkiller : ElementResist_Dragon_1_PAL
Zen Mind : ElementBoost_Normal_1_PAL
Pyromaniac : ElementBoost_Fire_1_PAL
Hydromaniac : ElementBoost_Aqua_1_PAL
Capacitor : ElementBoost_Thunder_1_PAL
Fragrant Foliage : ElementBoost_Leaf_1_PAL
Coldblooded : ElementBoost_Ice_1_PAL
Power of Gaia : ElementBoost_Earth_1_PAL
Veil of Darkness : ElementBoost_Dark_1_PAL
Blood of the Dragon : ElementBoost_Dragon_1_PAL
Celestial Emperor : ElementBoost_Normal_2_PAL
Flame Emperor : ElementBoost_Fire_2_PAL
Lord of the Sea : ElementBoost_Aqua_2_PAL
Lord of Lightning : ElementBoost_Thunder_2_PAL
Spirit Emperor : ElementBoost_Leaf_2_PAL
Ice Emperor : ElementBoost_Ice_2_PAL
Earth Emperor : ElementBoost_Earth_2_PAL
Lord of the Underworld : ElementBoost_Dark_2_PAL
Divine Dragon : ElementBoost_Dragon_2_PAL
Mercy Hit : NonKilling
Siren of the Void : Witch
Max Carrying Capacity Lv. 1 : MaxInventoryWeight_up_Equip_1
Max Carrying Capacity Lv. 2 : MaxInventoryWeight_up_Equip_2
Max Carrying Capacity Lv. 3 : MaxInventoryWeight_up_Equip_3
Nocturnal : Nocturnal
Serenity : CoolTimeReduction_Up_1
Impatient : CoolTimeReduction_Up_2
Easygoing : CoolTimeReduction_Down_1
Infinite Stamina : Stamina_Up_1
Fit as a Fiddle : Stamina_Up_2
Sickly : Stamina_Down_1
Noble : SalePrice_Up_1
Fine Furs : SalePrice_Up_2
Shabby : SalePrice_Down_1
Otherworldly Cells : Alien
Philanthropist : Test_PalEgg_HatchingSpeed_Up
Eternal Flame : EternalFlame